home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Code Resources / PICTButton CDEF 1.3.1 / PICTButton.c < prev    next >
C/C++ Source or Header  |  1996-07-07  |  6KB  |  244 lines

  1. /* ----------------------------------------------------------------------
  2.  
  3.     PICTButton CDEF
  4.     version 1.3.1
  5.     
  6.     Written by: Paul Celestin
  7.     
  8.     Copyright © 1993-1996 Celestin Company, Inc.
  9.     
  10.     This CDEF displays a picture whose resource ID is derived from
  11.     the min, max, and value fields of the CNTL. For a multiple-state
  12.     button, set min to ID of the the first PICT and max to the ID of
  13.     the last PICT. Also set value to the ID of the first PICT.
  14.     
  15.     930822 - 1.0.0    initial release
  16.     930829 - 1.0.1     added variations 1 and 2
  17.     930915 - 1.0.2    fixed the new variations
  18.     930922 - 1.0.3    fixed a problem with black and white PICTs showing
  19.                     up, or so I thought
  20.     931012 - 1.0.4    changed color of text in variation 2 to blue
  21.     931012 - 1.0.5    really fixed problem with black and white PICTs
  22.                     showing up properly
  23.     940319 - 1.0.6    removed unnecessary erasing code
  24.     940703 - 1.0.7    now works over multiple monitors of different bit
  25.                     depths
  26.     950804 - 1.1.0  finally converted this thing over to CodeWarrior!
  27.     950809 - 1.2.0  fixed bug in hasColor that caused computer to crash
  28.                     if button was partially or completely offscreen
  29.     951215 - 1.3.0  updated to CW7
  30.     960704 - 1.3.1  updated to CW9
  31.  
  32. ---------------------------------------------------------------------- */
  33.  
  34. #define kPlain            0
  35. #define kInverted        1
  36. #define kInvertedPICT    100
  37. #define kOffset            200
  38. #define kIsColorPort     0xC000 // If these bits are set, its a CGrafPort.
  39.  
  40.  
  41. /* ----------------------------------------------------------------------
  42. prototypes
  43. ---------------------------------------------------------------------- */
  44. pascal long main(short variation, ControlHandle theControl, short message, long param);
  45. int hasColor(Rect);
  46. void drawIt(ControlHandle control,short variation);
  47. long testIt(ControlHandle control, Point myPoint);
  48.  
  49.  
  50. /* ----------------------------------------------------------------------
  51. main
  52. ---------------------------------------------------------------------- */
  53. pascal long main(short variation, ControlHandle theControl, short message, long param)
  54. {
  55.     long    returnValue = 0L;
  56.     char    state = HGetState((Handle)theControl);
  57.     Str255    copyright = "\pCopyright © 1993-1996 Celestin Company, Inc.";
  58.  
  59.     switch(message)
  60.     {
  61.         case drawCntl:
  62.             drawIt(theControl,variation);
  63.         case testCntl:
  64.             returnValue = testIt(theControl, *(Point *) ¶m);
  65.         case calcCRgns:
  66.             break;
  67.           case initCntl:
  68.               break;
  69.         case dispCntl:
  70.             break;
  71.         case posCntl:
  72.             break;
  73.         case thumbCntl:
  74.             break;
  75.         case dragCntl:
  76.             break;
  77.         case autoTrack:
  78.             break;
  79.         case calcCntlRgn:
  80.             break;
  81.         case calcThumbRgn:
  82.             break;
  83.         default:
  84.             break;
  85.     }
  86.  
  87.     HSetState((Handle)theControl,state);
  88.  
  89.     return(returnValue);                /* tell them what happened */
  90. }
  91.  
  92.  
  93. /* ----------------------------------------------------------------------
  94. hasColor
  95. ---------------------------------------------------------------------- */
  96. int hasColor(Rect r)
  97.  
  98. {
  99.     SysEnvRec        myComputer;
  100.     GDHandle        curDev;
  101.     PixMapHandle    myPixMap;
  102.     
  103.     SysEnvirons(2,&myComputer);
  104.     if (myComputer.hasColorQD)
  105.     {
  106.         LocalToGlobal((Point*) &r);
  107.         LocalToGlobal(1 + (Point*) &r);
  108.         curDev = GetMaxDevice(&r);
  109.         if (curDev != nil)
  110.         {
  111.             myPixMap = (**curDev).gdPMap;
  112.             if ((**myPixMap).pixelSize > 1)
  113.                 return(1);
  114.             else
  115.                 return(0);
  116.         }
  117.     }
  118.     return(0);
  119. }
  120.  
  121.  
  122. /* ----------------------------------------------------------------------
  123. drawIt - here is where we actually draw the control
  124. ---------------------------------------------------------------------- */
  125. void drawIt(ControlHandle control, short variation)
  126.  
  127. {
  128.     short                invert = 0, useBW = 0;
  129.     int                    savedFont, savedSize, savedMode;
  130.     Rect                 myRect;
  131.     GrafPtr                thePort;
  132.     PicHandle            myPicture;
  133.     PenState            oldPenState;
  134.     Str255                myTitle;
  135.     Pattern                myGray;
  136.  
  137.     GetPort(&thePort);                            /* save off the current port */
  138.  
  139.     if (!(*control)->contrlVis)                    /* if not visible, do nothing */
  140.         return;
  141.  
  142.     myRect = (*control)->contrlRect;
  143.  
  144.     if (!hasColor(myRect))                        /* use the B&W PICTs */
  145.         useBW = kOffset;
  146.     
  147.     if ((*control)->contrlHilite == inButton)
  148.     {
  149.         invert = kInvertedPICT;                    /* invert while tracking */
  150.         SetControlReference(control, kInverted);
  151.     }
  152.     else
  153.     {
  154.         if ( (GetControlReference(control) == kInverted) && (!Button()) )
  155.         {
  156.             SetControlReference(control, kPlain);
  157.             if (GetControlValue(control) == GetControlMaximum(control))
  158.                 SetControlValue(control,GetControlMinimum(control));
  159.             else
  160.                 SetControlValue(control,GetControlValue(control) + 1);
  161.         }
  162.     }
  163.  
  164.     myPicture = (PicHandle)GetResource('PICT', (GetControlValue(control) + invert + useBW));
  165.     
  166.     if ( myPicture == 0L )                        /* could not find the PICT */
  167.         return;
  168.  
  169.     LoadResource((Handle)myPicture);
  170.     HNoPurge((Handle)myPicture);
  171.  
  172.     DrawPicture(myPicture, &myRect);            /* draw the picture */
  173.     
  174.     switch (variation)
  175.     {
  176.     case 1:                                        /* display title of control in geneva 9 */
  177.         {
  178.             savedFont = thePort->txFont;        /* save off current values */
  179.             savedSize = thePort->txSize;
  180.             savedMode = thePort->txMode;
  181.             
  182.             ForeColor(blueColor);
  183.             TextFont(geneva);
  184.             TextSize(9);
  185.             TextMode(srcOr);
  186.             
  187.             BlockMove(((*control)->contrlTitle),myTitle,((*control)->contrlTitle)[0] + 1);
  188.             
  189.             MoveTo((myRect.right+myRect.left) / 2 - StringWidth(myTitle) / 2, myRect.bottom - 6);
  190.             DrawString(myTitle);
  191.             
  192.             TextFont(savedFont);                /* restore saved values */
  193.             TextSize(savedSize);
  194.             TextMode(savedMode);
  195.             ForeColor(blackColor);
  196.             
  197.             break;
  198.         }
  199.     case 2:                                        /* simple 2-pixel wide black border */
  200.         {
  201.             PenSize(2,2);
  202.             InsetRect(&myRect,-3,-3);
  203.             FrameRect(&myRect);
  204.             InsetRect(&myRect,3,3);
  205.             PenSize(1,1);
  206.  
  207.             break;
  208.         }
  209.     }
  210.  
  211.     if ((*control)->contrlHilite == 255)        /* gray out the picture */
  212.     {
  213.         GetPenState(&oldPenState);
  214.         PenNormal();
  215.         GetIndPattern(&myGray,0,4);
  216.         PenPat(&myGray);
  217.         PenMode(patBic);
  218.         PaintRect(&myRect);
  219.         SetPenState(&oldPenState);
  220.     }
  221.     
  222.     HPurge((Handle)myPicture);
  223.     
  224.     return;                                        /* we are done drawing */
  225. }
  226.  
  227.  
  228. /* ----------------------------------------------------------------------
  229. testIt - test for mouse hits within control
  230. ---------------------------------------------------------------------- */
  231. long testIt(ControlHandle control, Point myPoint)
  232.  
  233. {
  234.     Rect myRect;
  235.  
  236.     myRect = (*control)->contrlRect;
  237.     
  238.     if    (((*control)->contrlVis != 0) && ((*control)->contrlHilite != 255) &&
  239.             (PtInRect(myPoint,&myRect)))
  240.         return(inButton);
  241.     else
  242.         return(0);
  243. }
  244.